package hxy.bytecode.thread;

import java.util.Random;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class AsyncCall {

    private Random random = new Random(System.currentTimeMillis());

    private ExecutorService tp = Executors.newFixedThreadPool(4);
//    private ExecutorService tp = Executors.newSingleThreadExecutor();


    //demo1,2,4,5调用方法
    public void call(hxy.bytecode.thread.BaseDemo demo) {
//    	开启多线程
        new Thread(() -> {

            long res = random.nextInt(10);

            try {
                Thread.sleep(res * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            demo.callback(res);
        }).start();
//        这个call方法就是结束了，但是里面的内容没有结束


    }

    //demo3调用方法
    public Future<Long> futureCall() {

        return tp.submit(() -> {
            long res = random.nextInt(10);
            System.out.println("已经提交");

            res = 5;

            try {
                Thread.sleep(res * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return res;
        });

    }

    public void shutdown() {

        tp.shutdown();

    }

    public static void main(String[] args) {
        AsyncCall asyncCall = new AsyncCall();
        Future<Long> longFuture = asyncCall.futureCall();
        System.out.println("开始第二次提交");
        Future<Long> longFuture1 = asyncCall.futureCall();
        try {
            long startTime = System.currentTimeMillis();
            Long aLong = longFuture.get();
            long startTime1 = System.currentTimeMillis();
//            System.out.println(aLong);
            Long aLong1 = longFuture1.get();
            long startTime2 = System.currentTimeMillis();
//            System.out.println(aLong1);
            long time1 = startTime1 - startTime;
            long time2 = startTime2 - startTime;

            System.out.println(time1 / 1000);
            System.out.println(time2 / 1000);

        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

}